from django.shortcuts import render
from .models import CoursesInfo
from django.core.paginator import PageNotAnInteger, EmptyPage, Paginator
from operations.models import UserLove, UserCourse
from django.db.models import Q
from tools.decorators import login_decorator


# from django.contrib.auth.decorators import login_required


# Create your views here.
def course_list(request):
    all_courses = CoursesInfo.objects.all()
    recommend = all_courses.order_by("-add_time")[:3]
    # 全局搜索
    keyword = request.GET.get("keyword","")
    if keyword:
        # __icontains包含什么（不区分大小写）
        all_courses = all_courses.filter(
            Q(name__icontains=keyword) | Q(desc__icontains=keyword) | Q(detail__icontains=keyword))
    sort = request.GET.get("sort", "")
    if sort:
        all_courses = all_courses.order_by("-" + sort)

    # 分页功能
    pagenum = request.GET.get("pagenum", "")
    pa = Paginator(all_courses, 3)
    try:
        pages = pa.page(pagenum)
    except PageNotAnInteger:
        pages = pa.page(1)
    except EmptyPage:
        pages = pa.page(pa.num_pages)
    return render(request, "courses/course-list.html", {
        "all_courses": all_courses,
        "recommend": recommend,
        "pages": pages,
        "sort": sort,
        "keyword": keyword,
        "tp": "b",

    })


def course_detail(request, course_id):
    if course_id:
        course = CoursesInfo.objects.filter(id=int(course_id))[0]
        relate_courses = CoursesInfo.objects.filter(category=course.category).exclude(id=int(course_id))[:2]
        course.click_num += 1
        course.save()
        lovecourses = False
        loveorg = False
        # lovecourses和loveorg 用来存储用户收藏这个东西的状态，在模板加载的时候来判断
        if request.user.is_authenticated:
            love = UserLove.objects.filter(love_id=int(course_id), love_type=2, love_statu=True, love_man=request.user)
            if love:
                lovecourses = True
            love1 = UserLove.objects.filter(love_id=int(course.orginfo.id), love_type=1, love_statu=True,
                                            love_man=request.user)
            if love1:
                loveorg = True
        return render(request, "courses/course-detail.html", {
            "course": course,
            "relate_courses": relate_courses,
            "lovecourses": lovecourses,
            "loveorg": loveorg,
            "tp": "b",
        })


@login_decorator
def course_video(request, course_id):
    coures = CoursesInfo.objects.filter(id=int(course_id))[0]
    # 当用户开始学习之后，代表这个用户学习了这个课程，我们需要去判断用户学习课程的表当中有没有学习这门课程的记录，
    # 如果没有，需要加上这条记录，代表用户学习了这门课程
    usercoures_list = UserCourse.objects.filter(study_man=request.user, study_course=coures)
    if not usercoures_list:
        a = UserCourse()
        a.study_man = request.user
        a.study_course = coures
        a.save()
        coures.study_num += 1
        coures.save()
        # coures.orginfo.study_num += 1
        # coures.orginfo.save()
        #     第一步：从学习课程的表当中查找当前这个人学习的所有课程
        usercoures_list2 = UserCourse.objects.filter(study_man=request.user)
        course_list2 = [usercourses.study_course for usercourses in usercoures_list2]
        #     第二步：根据拿到的所有课程，找到每个课程的机构
        org_list = list(set([coures.orginfo for coures in course_list2]))
        if coures.orginfo not in org_list:
            coures.orginfo.study_num += 1
            coures.orginfo.save()

    # 学过该课的同学还学过什么课程
    # 第一步 我们需要从中间表用户课程表当中找到学过该课的所有对象
    # 把所有学过该课程的对象提出来
    usercoures_list = UserCourse.objects.filter(study_course=coures)
    # 第二步 根据找到的用户学习课程列表，遍历拿到所有学习过这门课程的用户列表
    # 从对象中提取用户
    user_list = [usercoures.study_man for usercoures in usercoures_list]
    # 第三步 再根据找到的用户，从中间用户学习课程当中，找到所有用户学习其他课程的整个对象
    # __in表示 表中有包含这个列表的就返回   不包含的就排除  .exclude去除当前的课程
    usercoures_list = UserCourse.objects.filter(study_man__in=user_list).exclude(study_course=coures)
    # 第四步 从获取到的用户课程列表当中，拿到我们需要的其他课程
    # 从对象中提取课程   再去重  再封装成list
    course_list = list(set([usercoures.study_course for usercoures in usercoures_list]))
    return render(request, "courses/course-video.html", {
        "coures": coures,
        "course_list": course_list,
        "tp": "b",
    })


def course_comment(request, course_id):
    if course_id:
        coures = CoursesInfo.objects.filter(id=course_id)[0]
        # 学过该课的同学还学过什么课程
        # 第一步 我们需要从中间表用户课程表当中找到学过该课的所有对象
        # 把所有学过该课程的对象提出来
        usercoures_list = UserCourse.objects.filter(study_course=coures)
        # 第二步 根据找到的用户学习课程列表，遍历拿到所有学习过这门课程的用户列表
        # 从对象中提取用户
        user_list = [usercoures.study_man for usercoures in usercoures_list]
        # 第三步 再根据找到的用户，从中间用户学习课程当中，找到所有用户学习其他课程的整个对象
        # __in表示 表中有包含这个列表的就返回   不包含的就排除  .exclude去除当前的课程
        usercoures_list = UserCourse.objects.filter(study_man__in=user_list).exclude(study_course=coures)
        # 第四步 从获取到的用户课程列表当中，拿到我们需要的其他课程
        # 从对象中提取课程   再去重  再封装成list
        course_list = list(set([usercoures.study_course for usercoures in usercoures_list]))
        all_comments = coures.usercomment_set.all()[:10]
        return render(request, "courses/course-comment.html", {
            "coures": coures,
            "course_list": course_list,
            "all_comments": all_comments,
            "tp": "b",
        })
